#include <iostream>
#include <stdio.h>
using namespace std;

class AA 
{ 
public:
	AA(int a=0) 
	{ 
		X=a; 
		printf("AA()....\n");
		 
	}
	AA(const AA &p ) 	    //拷贝构造函数
	{ 
		X=p.X; 
		printf("AA(const AA &p)...\n");
	}
	~AA() 
	{ 
		printf("~AA()...\n");
	}

	int  GetX()
	{ 
		return X; 
	}	

private:
	int X;
};

//第四个应用场景
AA func()
{
	AA A(99);
	return A; //返回一个匿名对象A，执行过程自动调用拷贝构造函数。
}   


//匿名对象的去和留，关键看，返回时如何接，即是赋值还是初始化

int main()
{  
	func();//若不去接匿名对象，匿名对象直接析构

	//若返回的匿名对象，赋值给另外一个同类型的对象，那么匿名对象会被析构（有人要我，但没有重塑我，我只能消失）
	AA B;
	B=func();  //用匿名对象 赋值 给B对象，然后匿名对象析构，程序运行结束B析构
	printf("B %d\n",B.GetX());
	//若返回的匿名对象，来初始化另外一个同类型的对象，那么匿名对象会直接转成新的对象，不会析构（有人要我，并重塑我）
	AA C=func();//匿名对象转正不析构，程序运行结束C析构
	printf("C %d\n",C.GetX());
	return 0;
}
